package com.example.listener;

import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 用于处理邮件发送的消息队列监听器
 * 该类监听名为 "mail" 的消息队列，当有消息到达时，根据消息内容发送相应的邮件。
 */
@Component
@RabbitListener(queues = "mail")
public class MailQueueListener {

    // 注入JavaMailSender，用于发送邮件
    @Resource
    JavaMailSender sender;

    // 从配置文件中获取发件人的邮箱用户名
    @Value("${spring.mail.username}")
    String username;

    /**
     * 处理邮件发送的方法，当消息队列中有消息时会被调用。
     *
     * @param data 包含邮件信息的Map对象，其中应包含 "email"（收件人邮箱）、"code"（验证码）、"type"（邮件类型）等键值对。
     */
    @RabbitHandler
    public void sendMailMessage(Map<String, Object> data) {
        // 从Map中获取收件人邮箱地址
        String email = data.get("email").toString();
        // 从Map中获取验证码
        Integer code = (Integer) data.get("code");
        // 根据邮件类型创建相应的邮件消息对象
        SimpleMailMessage message = switch (data.get("type").toString()) {
            case "register" ->
                // 如果是注册邮件，创建相应的邮件内容
                    createMessage("欢迎注册我们的网站",
                            "您的邮件注册验证码为: " + code + "，有效时间3分钟，为了保障您的账户安全，请勿向他人泄露验证码信息。",
                            email);
            case "reset" ->
                // 如果是重置密码邮件，创建相应的邮件内容
                    createMessage("您的密码重置邮件",
                            "你好，您正在执行重置密码操作，验证码: " + code + "，有效时间3分钟，如非本人操作，请无视。",
                            email);
            case "modify" ->
                // 如果是修改邮箱邮件，创建相应的邮件内容
                    createMessage("您的邮箱修改邮件",
                            "你好，您正在执行邮箱修改操作，验证码: " + code + "，有效时间3分钟，如非本人操作，请无视。",
                            email);
            default -> null;
        };
        // 如果邮件消息对象为空，直接返回，不发送邮件
        if (message == null) return;
        // 使用JavaMailSender发送邮件
        sender.send(message);
    }

    /**
     * 快速封装简单邮件消息实体的方法。
     *
     * @param title 邮件的标题
     * @param content 邮件的内容
     * @param email 收件人的邮箱地址
     * @return 封装好的SimpleMailMessage对象
     */
    private SimpleMailMessage createMessage(String title, String content, String email) {
        // 创建一个新的SimpleMailMessage对象
        SimpleMailMessage message = new SimpleMailMessage();
        // 设置邮件的主题
        message.setSubject(title);
        // 设置邮件的内容
        message.setText(content);
        // 设置收件人的邮箱地址
        message.setTo(email);
        // 设置发件人的邮箱地址（从配置文件中获取）
        message.setFrom(username);
        // 返回封装好的邮件消息对象
        return message;
    }
}